<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>async函数</title>
</head>
<body>

<!--
  async函数(源自ES2017)
  概念： 真正意义上去解决异步回调的问题，同步流程表达异步操作
  本质： Generator的语法糖
  语法：
      async function foo() {
        await 异步操作;
        await 异步操作；
      }
  特点：
    1、不需要像Generator去调用next方法，遇到await等待，当前的异步操作完成就往下执行
    2、返回的总是Promise对象，可以用then方法进行下一步操作
    3、async取代Generator函数的星号*，await取代Generator的yield
    4、语意上更为明确，使用简单，经临床验证，暂时没有任何副作用

-->
<script type="text/javascript" src="./js/jquery-1.10.1.min.js"></script>
<script type="text/javascript">

// 1. 测试
async function sendData(){
	return new Promise((resolve,reject) => {
		setTimeout(resolve,2000)
	})
}
    
function getMsg(){
	return "getMsg"
}

// 调用该方法的时候都是顺序调用
async function testData(){
	console.log("调用 sendData() 之前 ...  ",new Date())	
	let res = await sendData()	
	console.log("await的返回值：",res)	
	console.log("调用 sendData() 之后 ...  ",new Date())	
	
	//调用普通函数返回值就是该函数的返回值
	let res2 = await getMsg();
	console.log("res2：",res2)	
	
	//调用Promise.resolve的话返回该函数的参数值
	let res3 = await Promise.resolve("resolver ... ");
	console.log("res3：",res3)	
	
	//调用Promise.resolve的话返回该函数的参数值
	let res4 = await Promise.reject("reject ... ");
	console.log("res4：",res4)	
	
}

//testData();

// 使用 async 编写请求新闻的方法
async function getNews(_url){
	return new Promise(
		(resolver,reject ) => {
			$.ajax({
				type:"post",
				url:_url,
				success:function(data){
					resolver(data)
				},
				error:function(error){
					//reject(error)//防止请求出错，调用该方法输出错误
					reject({
					  "code": 500,
					  "message": "出错了！"
					})
					//resolver(false)//出错还是使用该方法,为的是下面好处理
					/*resolver({
					  "code": 500,
					  "message": "出错了！"
					})*/
				}
			})
	})
}

async function sendDataForNews(){
	console.log("getNews() 之前 ... ");
	let res
	try {
	  res = await getNews("http:localhost:8080/news?id=7");
	  console.log("await 返回值：",res);
	} catch(err) {
	  console.log("await 抛异常了！：",err);
	} finally {
	  console.log(" finally 代码块");
	}
	if(!res){
		alert("暂时没有消息,刷新后重试!");
		return;
	}
	
	console.log("getNews() 之后 ... ");
	
}

sendDataForNews()

</script>

</body>
</html>